package com.course.server.service;

import com.course.server.domain.User;
import com.course.server.domain.UserExample;
import com.course.server.dto.LoginUserDto;
import com.course.server.dto.UserDto;
import com.course.server.dto.PageDto;
import com.course.server.exception.BusinessException;
import com.course.server.exception.BusinessExceptionCode;
import com.course.server.mapper.UserMapper;
import com.course.server.util.CopyUtil;
import com.course.server.util.UuidUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.List;

@Service
public class UserService {


    private static final Logger LOG = LoggerFactory.getLogger(UserService.class);
    //---------------固定注入---------------
    @Resource
    private UserMapper userMapper;

    /*
    * 测试版本3:列表查询-集成分页
    * */

    public void list(PageDto pageDto){
        //---------------mybatis-pagehelper插件使用---------------
        //初始化分页插件的属性:num第几页,size当前页显示条数,就近执行最近的select语句
        // 自动寻找执行第一个select语句会进行分页(.selectByExample)
        // 使用分页查询功能需要两条sql,一是查总记录数,一是当前页记录
        PageHelper.startPage(pageDto.getPage(),pageDto.getSize());//获取当前页和每页条数(前端传进来的)
        //---------------固定开始---------------
        UserExample userExample = new UserExample();//创建[sql引擎]
        //---------------开始调用---------------
        //执行select,调用mapper查询到的List对象用 [查询List结果对象] 存放起来
        List<User> userList = userMapper.selectByExample(userExample);
        //创建一个 [页面信息对象] 存放查到的结果对象
        PageInfo<User> pageInfo = new PageInfo<>(userList);
        //在 [页面信息对象] 中获取总条数 设置到pageDto数据传输对象
        pageDto.setTotal(pageInfo.getTotal());
        List<UserDto> userDtoList = CopyUtil.copyList(userList, UserDto.class);
        //[页面传输对象]=活动list数据传输对象+总条数
        pageDto.setList(userDtoList);
        //---------------结束---------------
    }

    /*
    * 添加活动,判断是否有ID
    * */
    public void save(UserDto userDto){
        User user = CopyUtil.copy(userDto,User.class);
        if(StringUtils.isEmpty(userDto.getId())){
            this.insert(user);
        }else {
            this.update(user);
        }
    }


    /*
     * 新增活动,没有ID
     * */
    private void insert(User user){
        //---------------固定开始---------------
        //---------------从前端接收数据: Dto --> Domain---------------
        user.setId(UuidUtil.getShortUuid());//前端没有传输ID值,需要我们自动生成
        //---------------开始调用---------------
        User userDb = this.selectByLoginName(user.getLoginName());
        if (userDb != null) {
            throw new BusinessException(BusinessExceptionCode.USER_LOGIN_NAME_EXIST);
        }
        userMapper.insert(user);
        //---------------结束---------------
    }

    /*
     * 修改活动,有ID
     * */
    private void update(User user){
        //---------------固定开始---------------
        //---------------开始调用---------------
        user.setPassword(null);
        userMapper.updateByPrimaryKeySelective(user);
        //---------------结束---------------
    }

    /*
     * 根据ID查询活动
     * */
    public UserDto selectById(String id){
        //---------------固定开始---------------
        //---------------开始调用---------------
        User user = userMapper.selectByPrimaryKey(id);
        return CopyUtil.copy(user,UserDto.class);
        //---------------结束---------------
    }

    /*
     * 模糊查询活动
     * */
    public void selectByName(PageDto pageDto){
        //---------------固定开始---------------
        //---------------开始调用---------------
        //---------------mybatis-pagehelper插件使用---------------
        //初始化分页插件的属性:num第几页,size当前页显示条数,就近执行最近的select语句
        // 自动寻找执行第一个select语句会进行分页(.selectByExample)
        // 使用分页查询功能需要两条sql,一是查总记录数,一是当前页记录
        PageHelper.startPage(pageDto.getPage(),pageDto.getSize());//获取当前页和每页条数(前端传进来的)


        //开始拼装SQL
        UserExample example = new UserExample();//创建对应的Example
        UserExample.Criteria criteria = example.createCriteria();//创建对应的where

        //生成器启动的时候这部分需要手动更改因为实体名称不一致
        if(pageDto.getName()!=null&&!"".equals(pageDto.getName())){//不为空的时候拼接
            criteria.andNameLike("%"+pageDto.getName()+"%");
        }
        List<User> userList = userMapper.selectByExample(example);
        //创建一个 [页面信息对象] 存放查到的结果对象
        PageInfo<User> pageInfo = new PageInfo<>(userList);
        //在 [页面信息对象] 中获取总条数 设置到pageDto数据传输对象
        pageDto.setTotal(pageInfo.getTotal());
        List<UserDto> userDtoList = CopyUtil.copyList(userList, UserDto.class);
        //[页面传输对象]=活动list数据传输对象+总条数
        pageDto.setList(userDtoList);
        //---------------结束---------------
    }

    /*
    * 删除活动
    * */
    public void delete(String id){
        userMapper.deleteByPrimaryKey(id);
    }

    /*
     *  修改状态值
     * */
    public void changedStatus(UserDto userDto){
        //---------------固定开始---------------
        //---------------开始调用---------------
        User user = CopyUtil.copy(userDto,User.class);
        userMapper.updateByPrimaryKey(user);
        //---------------结束---------------
    }

    /**
     * 根据登录名查询用户信息
     * @param loginName
     * @return
     */
    public User selectByLoginName(String loginName) {
        UserExample userExample = new UserExample();
        userExample.createCriteria().andLoginNameEqualTo(loginName);
        List<User> userList = userMapper.selectByExample(userExample);
        if (CollectionUtils.isEmpty(userList)) {
            return null;
        } else {
            return userList.get(0);
        }
    }

    /**
     * 重置密码
     * @param userDto
     */
    public void savePassword(UserDto userDto) {
        User user = new User();
        user.setId(userDto.getId());
        user.setPassword(userDto.getPassword());
        userMapper.updateByPrimaryKeySelective(user);
    }

    /**
     * 登录
     * @param userDto
     */
    public LoginUserDto login(UserDto userDto) {
        User user = selectByLoginName(userDto.getLoginName());
        if (user == null) {
            LOG.info("用户名不存在, {}", userDto.getLoginName());
            throw new BusinessException(BusinessExceptionCode.LOGIN_USER_ERROR);
        } else {
            if (user.getPassword().equals(userDto.getPassword())) {
                // 登录成功
                return CopyUtil.copy(user, LoginUserDto.class);
                // 为登录用户读取权限
            } else {
                LOG.info("密码不对, 输入密码：{}, 数据库密码：{}", userDto.getPassword(), user.getPassword());
                throw new BusinessException(BusinessExceptionCode.LOGIN_USER_ERROR);
            }
        }
    }


}


